package com.lh.leetcodetop100.滑动窗口;

import java.util.HashSet;
import java.util.Set;

/**
 * @author: linghao
 * @since: 2022/10/30
 */
public class 无重复字符的最长子串_3 {

    /*
        滑动窗口：定义两个指针当做滑动窗口的左右指针
            右指针右移添加元素，左指针右移删除元素

        给定一个字符串 s ，请你找出其中不含有重复字符的 最长子串 的长度。

        leetcode 滑动窗口类题目：
        3. 无重复字符的最长子串
        30. 串联所有单词的子串
        76. 最小覆盖子串
        159. 至多包含两个不同字符的最长子串
        209. 长度最小的子数组
        239. 滑动窗口最大值
        567. 字符串的排列
        632. 最小区间
        727. 最小窗口子序列

     */

    public int lengthOfLongestSubstring(String s) {
        Set<Character> set = new HashSet<>();  //元素重复判断
        int len = s.length();
        //rk当做滑动窗口的右指针
        int rk = -1,ans = 0;
        for(int i=0;i<len;i++){ //i当做滑动窗口的左指针
            if(i != 0){
                set.remove(s.charAt(i-1));
            }
            while (rk+1<len && !set.contains(s.charAt(rk+1))){
                set.add(s.charAt(rk+1));
                rk++;
            }
            //取做大长度
            ans = Math.max(ans,rk-i+1);
        }
        return ans;
    }
}
